package org.qiyu.live.im.core.server.common;

import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.ByteToMessageDecoder;
import org.qiyu.live.im.constants.ImConstants;

import java.util.List;

/**
 * @Description: 处理消息的解码过程
 * @Author: 张广焱
 * @Date: 2023-12-03 12:39
 */
public class ImMsgDecoder extends ByteToMessageDecoder {

    //消息的基本长度
    private  final int BASE_LEN = 2+2+4;
    @Override
    protected void decode(ChannelHandlerContext ctx, ByteBuf bytebuf, List<Object> out) throws Exception {
        //bytebuf 内容的基本校验  长度校验  magic值校验
        if (bytebuf.readableBytes()>=BASE_LEN){
            if (bytebuf.readShort()!= ImConstants.DEFAULT_MAGIC){
                ctx.close();
                return;
            }
            //读取消息的长度
            int code = bytebuf.readInt();
            int len = bytebuf.readInt();
            //判断消息体的长度 如果消息小于 说明消息还没有完全到达
            if (bytebuf.readableBytes()<len){
                ctx.close();
                return;
            }
            //读取body数组
            byte[] body = new byte[len];
            bytebuf.readBytes(body);
            //封装成immsg对象
            ImMsg imMsg = new ImMsg();
            imMsg.setCode(code);
            imMsg.setLen(len);
            imMsg.setMagic(ImConstants.DEFAULT_MAGIC);
            imMsg.setBody(body);
            //下游处理器就能读取到immsg对象
            out.add(imMsg);

        }

        //bytebuf 转为immsg对象

    }
}
